<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
<style>
body {
  font-family: Helvetica, arial, sans-serif;
  font-size: 14px;
  line-height: 1.6;
  padding-top: 10px;
  padding-bottom: 10px;
  background-color: white;
  padding: 30px; }

body > *:first-child {
  margin-top: 0 !important; }
body > *:last-child {
  margin-bottom: 0 !important; }

a {
  color: #4183C4; }
a.absent {
  color: #cc0000; }
a.anchor {
  display: block;
  padding-left: 30px;
  margin-left: -30px;
  cursor: pointer;
  position: absolute;
  top: 0;
  left: 0;
  bottom: 0; }

h1, h2, h3, h4, h5, h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
  -webkit-font-smoothing: antialiased;
  cursor: text;
  position: relative; }

h1:hover a.anchor, h2:hover a.anchor, h3:hover a.anchor, h4:hover a.anchor, h5:hover a.anchor, h6:hover a.anchor {
  background: url() no-repeat 10px center;
  text-decoration: none; }

h1 tt, h1 code {
  font-size: inherit; }

h2 tt, h2 code {
  font-size: inherit; }

h3 tt, h3 code {
  font-size: inherit; }

h4 tt, h4 code {
  font-size: inherit; }

h5 tt, h5 code {
  font-size: inherit; }

h6 tt, h6 code {
  font-size: inherit; }

h1 {
  font-size: 28px;
  color: black; }

h2 {
  font-size: 24px;
  border-bottom: 1px solid #cccccc;
  color: black; }

h3 {
  font-size: 18px; }

h4 {
  font-size: 16px; }

h5 {
  font-size: 14px; }

h6 {
  color: #777777;
  font-size: 14px; }

p, blockquote, ul, ol, dl, li, table, pre {
  margin: 15px 0; }

hr {
  background: transparent url() repeat-x 0 0;
  border: 0 none;
  color: #cccccc;
  height: 4px;
  padding: 0;
}

body > h2:first-child {
  margin-top: 0;
  padding-top: 0; }
body > h1:first-child {
  margin-top: 0;
  padding-top: 0; }
  body > h1:first-child + h2 {
    margin-top: 0;
    padding-top: 0; }
body > h3:first-child, body > h4:first-child, body > h5:first-child, body > h6:first-child {
  margin-top: 0;
  padding-top: 0; }

a:first-child h1, a:first-child h2, a:first-child h3, a:first-child h4, a:first-child h5, a:first-child h6 {
  margin-top: 0;
  padding-top: 0; }

h1 p, h2 p, h3 p, h4 p, h5 p, h6 p {
  margin-top: 0; }

li p.first {
  display: inline-block; }
li {
  margin: 0; }
ul, ol {
  padding-left: 30px; }

ul :first-child, ol :first-child {
  margin-top: 0; }

dl {
  padding: 0; }
  dl dt {
    font-size: 14px;
    font-weight: bold;
    font-style: italic;
    padding: 0;
    margin: 15px 0 5px; }
    dl dt:first-child {
      padding: 0; }
    dl dt > :first-child {
      margin-top: 0; }
    dl dt > :last-child {
      margin-bottom: 0; }
  dl dd {
    margin: 0 0 15px;
    padding: 0 15px; }
    dl dd > :first-child {
      margin-top: 0; }
    dl dd > :last-child {
      margin-bottom: 0; }

blockquote {
  border-left: 4px solid #dddddd;
  padding: 0 15px;
  color: #777777; }
  blockquote > :first-child {
    margin-top: 0; }
  blockquote > :last-child {
    margin-bottom: 0; }

table {
  padding: 0;border-collapse: collapse; }
  table tr {
    border-top: 1px solid #cccccc;
    background-color: white;
    margin: 0;
    padding: 0; }
    table tr:nth-child(2n) {
      background-color: #f8f8f8; }
    table tr th {
      font-weight: bold;
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr td {
      border: 1px solid #cccccc;
      margin: 0;
      padding: 6px 13px; }
    table tr th :first-child, table tr td :first-child {
      margin-top: 0; }
    table tr th :last-child, table tr td :last-child {
      margin-bottom: 0; }

img {
  max-width: 100%; }

span.frame {
  display: block;
  overflow: hidden; }
  span.frame > span {
    border: 1px solid #dddddd;
    display: block;
    float: left;
    overflow: hidden;
    margin: 13px 0 0;
    padding: 7px;
    width: auto; }
  span.frame span img {
    display: block;
    float: left; }
  span.frame span span {
    clear: both;
    color: #333333;
    display: block;
    padding: 5px 0 0; }
span.align-center {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-center > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: center; }
  span.align-center span img {
    margin: 0 auto;
    text-align: center; }
span.align-right {
  display: block;
  overflow: hidden;
  clear: both; }
  span.align-right > span {
    display: block;
    overflow: hidden;
    margin: 13px 0 0;
    text-align: right; }
  span.align-right span img {
    margin: 0;
    text-align: right; }
span.float-left {
  display: block;
  margin-right: 13px;
  overflow: hidden;
  float: left; }
  span.float-left span {
    margin: 13px 0 0; }
span.float-right {
  display: block;
  margin-left: 13px;
  overflow: hidden;
  float: right; }
  span.float-right > span {
    display: block;
    overflow: hidden;
    margin: 13px auto 0;
    text-align: right; }

code, tt {
  margin: 0 2px;
  padding: 0 5px;
  white-space: nowrap;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px; }

pre code {
  margin: 0;
  padding: 0;
  white-space: pre;
  border: none;
  background: transparent; }

.highlight pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }

pre {
  background-color: #f8f8f8;
  border: 1px solid #cccccc;
  font-size: 13px;
  line-height: 19px;
  overflow: auto;
  padding: 6px 10px;
  border-radius: 3px; }
  pre code, pre tt {
    background-color: transparent;
    border: none; }

sup {
    font-size: 0.83em;
    vertical-align: super;
    line-height: 0;
}
* {
	-webkit-print-color-adjust: exact;
}
@media screen and (min-width: 914px) {
    body {
        width: 854px;
        margin:0 auto;
    }
}
@media print {
	table, pre {
		page-break-inside: avoid;
	}
	pre {
		word-wrap: break-word;
	}
}
</style>
<title>查询生成器</title>

</head>
<body>
<h1>查询生成器</h1>

<ul>
<li><a href="#introduction">简介</a></li>
<li><a href="#selects">查询</a></li>
<li><a href="#joins">连接</a></li>
<li><a href="#advanced-wheres">高级Wheres</a></li>
<li><a href="#aggregates">统计</a></li>
<li><a href="#raw-expressions">原始表达式</a></li>
<li><a href="#inserts">插入</a></li>
<li><a href="#updates">更新</a></li>
<li><a href="#deletes">删除</a></li>
<li><a href="#unions">联合</a></li>
<li><a href="#caching-queries">缓存查询</a></li>
</ul>


<p><a name="introduction"></a></p>

<h2>简介</h2>

<p>数据库查询生成器提供了一种方便、流畅的接口用于创建和执行数据库查询。它可用于在应用程序中执行大多数数据库操作，并且适用于所有支持的数据库系统。</p>

<blockquote><p><strong>注意:</strong> Laravel 查询生成器使用 PDO 参数绑定来保护您的应用程序抵御 SQL 注入攻击。没有必要清理通过绑定传递的字符串。</p></blockquote>

<p><a name="selects"></a></p>

<h2>查询</h2>

<p><strong>获取一个表中的所有行</strong></p>

<pre><code>$users = DB::table('users')-&gt;get();

foreach ($users as $user)
{
    var_dump($user-&gt;name);
}
</code></pre>

<p><strong>获取一个表中的某一行</strong></p>

<pre><code>$user = DB::table('users')-&gt;where('name', 'John')-&gt;first();

var_dump($user-&gt;name);
</code></pre>

<p><strong>获取某一行中的某一列</strong></p>

<pre><code>$name = DB::table('users')-&gt;where('name', 'John')-&gt;pluck('name');
</code></pre>

<p><strong>获取某一列的值</strong></p>

<pre><code>$roles = DB::table('roles')-&gt;lists('title');
</code></pre>

<p>这个方法将返回一个所有 title 的列表。您也可以对返回的数组指定一个指定的键：</p>

<pre><code>$roles = DB::table('roles')-&gt;lists('title', 'name');
</code></pre>

<p><strong>指定 Select 子句</strong></p>

<pre><code>$users = DB::table('users')-&gt;select('name', 'email')-&gt;get();

$users = DB::table('users')-&gt;distinct()-&gt;get();

$users = DB::table('users')-&gt;select('name as user_name')-&gt;get();
</code></pre>

<p><strong>对一个已存在的查询添加一个 Select 子句</strong></p>

<pre><code>$query = DB::table('users')-&gt;select('name');

$users = $query-&gt;addSelect('age')-&gt;get();
</code></pre>

<p><strong>使用 Where 运算符</strong></p>

<pre><code>$users = DB::table('users')-&gt;where('votes', '&gt;', 100)-&gt;get();
</code></pre>

<p><strong>Or 子句</strong></p>

<pre><code>$users = DB::table('users')
                    -&gt;where('votes', '&gt;', 100)
                    -&gt;orWhere('name', 'John')
                    -&gt;get();
</code></pre>

<p><strong>使用 Where Between</strong></p>

<pre><code>$users = DB::table('users')
                    -&gt;whereBetween('votes', array(1, 100))-&gt;get();
</code></pre>

<p><strong>使用 Where In 和一个数组</strong></p>

<pre><code>$users = DB::table('users')
                    -&gt;whereIn('id', array(1, 2, 3))-&gt;get();

$users = DB::table('users')
                    -&gt;whereNotIn('id', array(1, 2, 3))-&gt;get();
</code></pre>

<p><strong>使用 Where Null 查找没有赋值的记录</strong></p>

<pre><code>$users = DB::table('users')
                    -&gt;whereNull('updated_at')-&gt;get();
</code></pre>

<p><strong>Order By, Group By 和 Having</strong></p>

<pre><code>$users = DB::table('users')
                    -&gt;orderBy('name', 'desc')
                    -&gt;groupBy('count')
                    -&gt;having('count', '&gt;', 100)
                    -&gt;get();
</code></pre>

<p><strong>Offset &amp; Limit</strong></p>

<pre><code>$users = DB::table('users')-&gt;skip(10)-&gt;take(5)-&gt;get();
</code></pre>

<p><a name="joins"></a></p>

<h2>连接</h2>

<p>查询生成器也可用于编写连接表达式，请看下面的例子：</p>

<p><strong>基础连接表达式</strong></p>

<pre><code>DB::table('users')
            -&gt;join('contacts', 'users.id', '=', 'contacts.user_id')
            -&gt;join('orders', 'users.id', '=', 'orders.user_id')
            -&gt;select('users.id', 'contacts.phone', 'orders.price');
</code></pre>

<p>您可以指定更高级的连接子句：</p>

<pre><code>DB::table('users')
        -&gt;join('contacts', function($join)
        {
            $join-&gt;on('users.id', '=', 'contacts.user_id')-&gt;orOn(...);
        })
        -&gt;get();
</code></pre>

<p><a name="advanced-wheres"></a></p>

<h2>高级Wheres</h2>

<p>有时您可能需要创建跟高级的 where 子句，比如 "where exists" 或 嵌套参数组合。Laravel 查询生成器也能够处理这些：</p>

<p><strong>参数组合</strong></p>

<pre><code>DB::table('users')
            -&gt;where('name', '=', 'John')
            -&gt;orWhere(function($query)
            {
                $query-&gt;where('votes', '&gt;', 100)
                      -&gt;where('title', '&lt;&gt;', 'Admin');
            })
            -&gt;get();
</code></pre>

<p>上面的查询将产生下面的 SQL 语句:</p>

<pre><code>select * from users where name = 'John' or (votes &gt; 100 and title &lt;&gt; 'Admin')
</code></pre>

<p><strong>存在表达式</strong></p>

<pre><code>DB::table('users')
            -&gt;whereExists(function($query)
            {
                $query-&gt;select(DB::raw(1))
                      -&gt;from('orders')
                      -&gt;whereRaw('orders.user_id = users.id');
            })
            -&gt;get();
</code></pre>

<p>上面的查询将产生下面的 SQL 语句:</p>

<pre><code>select * from users
where exists (
    select 1 from orders where orders.user_id = users.id
)
</code></pre>

<p><a name="aggregates"></a></p>

<h2>统计</h2>

<p>查询生成器也提供了一系列的统计函数，比如 <code>count</code>, <code>max</code>, <code>min</code>, <code>avg</code> 以及 <code>sum</code>函数。</p>

<p><strong>使用统计函数</strong></p>

<pre><code>$users = DB::table('users')-&gt;count();

$price = DB::table('orders')-&gt;max('price');

$price = DB::table('orders')-&gt;min('price');

$price = DB::table('orders')-&gt;avg('price');

$total = DB::table('users')-&gt;sum('votes');
</code></pre>

<p><a name="raw-expressions"></a></p>

<h2>原始表达式</h2>

<p>有时您可能需要使用在查询中使用一个原始表达式。这些表达式有可能在查询中被注入，所以不要留下任何可以 SQL 注入的地方！创建一个原始表达式，您可以使用 <code>DB::raw</code> 函数：</p>

<p><strong>使用原始表达式</strong></p>

<pre><code>$users = DB::table('users')
                     -&gt;select(DB::raw('count(*) as user_count, status'))
                     -&gt;where('status', '&lt;&gt;', 1)
                     -&gt;groupBy('status')
                     -&gt;get();
</code></pre>

<p><strong>递增或递减一个字段的值</strong></p>

<pre><code>DB::table('users')-&gt;increment('votes');

DB::table('users')-&gt;increment('votes', 5);

DB::table('users')-&gt;decrement('votes');

DB::table('users')-&gt;decrement('votes', 5);
</code></pre>

<p>您也可以为更新指定其他的字段：</p>

<pre><code>DB::table('users')-&gt;increment('votes', 1, array('name' =&gt; 'John'));
</code></pre>

<p><a name="inserts"></a></p>

<h2>插入</h2>

<p><strong>向表中插入一条记录</strong></p>

<pre><code>DB::table('users')-&gt;insert(
    array('email' =&gt; 'john@example.com', 'votes' =&gt; 0)
);
</code></pre>

<p>如果表中有一个自动递增的 ID 字段，使用 <code>insertGetId</code> 插入一条记录并获取 ID:</p>

<p><strong>向带有自动递增的 ID 字段的表中插入一条记录</strong></p>

<pre><code>$id = DB::table('users')-&gt;insertGetId(
    array('email' =&gt; 'john@example.com', 'votes' =&gt; 0)
);
</code></pre>

<blockquote><p><strong>注意:</strong> 当使用 PostgreSQL，insertGetId 函数需要自动递增的字段命名为 "id"。</p></blockquote>

<p><strong>向表中一次性插入多条记录</strong></p>

<pre><code>DB::table('users')-&gt;insert(array(
    array('email' =&gt; 'taylor@example.com', 'votes' =&gt; 0),
    array('email' =&gt; 'dayle@example.com', 'votes' =&gt; 0),
));
</code></pre>

<p><a name="updates"></a></p>

<h2>更新</h2>

<p><strong>更新表中的一条记录</strong></p>

<pre><code>DB::table('users')
            -&gt;where('id', 1)
            -&gt;update(array('votes' =&gt; 1));
</code></pre>

<p><a name="deletes"></a></p>

<h2>删除</h2>

<p><strong>删除表中的一条记录</strong></p>

<pre><code>DB::table('users')-&gt;where('votes', '&lt;', 100)-&gt;delete();
</code></pre>

<p><strong>删除表中的所有记录</strong></p>

<pre><code>DB::table('users')-&gt;delete();
</code></pre>

<p><strong>清空表</strong></p>

<pre><code>DB::table('users')-&gt;truncate();
</code></pre>

<p><a name="unions"></a></p>

<h2>联合</h2>

<p>查询生成器也提供了一种快速的方法联合两个查询：</p>

<p><strong>执行一个查询联合</strong></p>

<pre><code>$first = DB::table('users')-&gt;whereNull('first_name');

$users = DB::table('users')-&gt;whereNull('last_name')-&gt;union($first)-&gt;get();
</code></pre>

<p>也可以使用 <code>unionAll</code>，与 <code>union</code> 有同样的签名。</p>

<p><a name="caching-queries"></a></p>

<h2>缓存查询</h2>

<p>您可以很容易地使用 <code>remember</code> 函数缓存一个查询的结果：</p>

<p><strong>缓存一个查询的结果</strong></p>

<pre><code>$users = DB::table('users')-&gt;remember(10)-&gt;get();
</code></pre>

<p>在这个例子中，查询的结果将被缓存十分钟。因为查询结果被缓存，查询将不会在数据库中运行，结果将从应用程序指定的默认的缓存系统中加载。</p>
</body>
</html>